const vscode = require('vscode');
const fs = require('fs-extra');
const path = require('path');
const configManager = require('./configManager');

/**
 * 从模板库中选择模板并插入内容到当前编辑器位置
 * @param {Object} options 可选参数，包含触发位置和文本
 * @returns {Promise<boolean>} 是否成功插入内容
 */
async function insertFromTemplate(options) {
    try {
        // 获取当前活动编辑器
        const editor = vscode.window.activeTextEditor;
        if (!editor) {
            vscode.window.showErrorMessage('没有打开的编辑器');
            return false;
        }
        
        // 保存触发信息，用于后续替换
        const triggerInfo = options && options.triggerPosition ? {
            position: options.triggerPosition,
            text: options.triggerText || 'ftu'
        } : null;

        // 获取模板库列表
        const repositories = await configManager.getRepositories();
        if (!repositories || repositories.length === 0) {
            vscode.window.showErrorMessage('没有配置模板库，请先在设置中配置模板库');
            return false;
        }

        // 选择模板库
        const repositoryNames = repositories.map(repo => repo.name);
        const selectedRepositoryName = await vscode.window.showQuickPick(repositoryNames, {
            placeHolder: '选择模板库'
        });

        if (!selectedRepositoryName) {
            return false; // 用户取消选择
        }

        const selectedRepository = repositories.find(repo => repo.name === selectedRepositoryName);
        
        // 获取模板库中的文件列表
        const templatePath = selectedRepository.type === 'local' 
            ? selectedRepository.path 
            : path.join(selectedRepository.localPath, selectedRepository.path || '');
        
        const files = await getTemplateFiles(templatePath);
        
        if (files.length === 0) {
            vscode.window.showErrorMessage(`模板库 ${selectedRepositoryName} 中没有可用的模板文件`);
            return false;
        }

        // 选择模板文件
        const templateItems = files.map(file => ({
            label: path.basename(file),
            description: file.replace(templatePath, ''),
            filePath: file
        }));

        const selectedTemplate = await vscode.window.showQuickPick(templateItems, {
            placeHolder: '选择模板文件'
        });

        if (!selectedTemplate) {
            return false; // 用户取消选择
        }

        // 读取模板文件内容
        const templateContent = await fs.readFile(selectedTemplate.filePath, 'utf8');
        
        // 插入内容到当前编辑器位置
        if (triggerInfo) {
            // 如果是通过代码提示触发的，则替换掉触发文本
            const startPos = new vscode.Position(
                triggerInfo.position.line,
                triggerInfo.position.character - triggerInfo.text.length
            );
            const endPos = triggerInfo.position;
            const range = new vscode.Range(startPos, endPos);
            
            await editor.edit(editBuilder => {
                editBuilder.replace(range, templateContent);
            });
        } else {
            // 否则直接在光标位置插入
            await editor.edit(editBuilder => {
                editBuilder.insert(editor.selection.active, templateContent);
            });
        }

        vscode.window.showInformationMessage(`已成功插入模板 ${selectedTemplate.label} 的内容`);
        return true;
    } catch (error) {
        vscode.window.showErrorMessage(`插入模板内容失败: ${error.message}`);
        console.error('插入模板内容失败:', error);
        return false;
    }
}

/**
 * 获取指定目录下的所有模板文件
 * @param {string} dirPath 目录路径
 * @returns {Promise<string[]>} 文件路径列表
 */
async function getTemplateFiles(dirPath) {
    try {
        const result = [];
        const files = await fs.readdir(dirPath);
        
        for (const file of files) {
            const filePath = path.join(dirPath, file);
            const stat = await fs.stat(filePath);
            
            if (!stat.isDirectory()) {
                // 递归获取子目录中的文件
                // const subFiles = await getTemplateFiles(filePath);
                // result.push(...subFiles);
            } else {
                result.push(filePath);
            }
        }
        
        return result;
    } catch (error) {
        console.error('获取模板文件列表失败:', error);
        return [];
    }
}

module.exports = {
    insertFromTemplate
};